/**
 * @file tabs.h
 * @author yonglin_zhang
 * @brief 制表符模块
 * @version 0.1
 * @date 2024-06-03
 * 
 * @copyright Copyright (c) 2024
 * 
 */ 

#define COMMON_TABS_OK                              0x0000  /* < 执行成功 */
#define COMMON_TABS_BAD_INPUT                       0x0001  /* < 非法入参 */
#define COMMON_TABS_MALLOC_FAILED                   0x0002  /* < 申请内存失败 */
#define COMMON_TABS_NEED_INIT                       0x0003  /* < 需要初始化 */
#define COMMON_TABS_ALREADY_INITED                  0x0004  /* < 已经初始化 */
#define COMMON_TABS_HEADERS_ARE_REQUIRED            0x0005  /* < 需要先添加表头 */
#define COMMON_TABS_HEADER_AND_DATA_MISMATCH        0x0006  /* < 数据和表头的个数不匹配 */

typedef struct tab_handler tab_handler;

/**
 * @brief 表格句柄初始化
 * 
 * @warning *handler必须为NULL，否则视为初始化过
 * 
 * @param handler[in/out] 二级指针，传入后自动初始化
 * @return int 错误码
 */
int common_tabs_init(tab_handler ** handler);

/**
 * @brief 表格句柄释放
 * 
 * @param handler[in/out] 二级指针，传入后自动释放并赋值为NULL
 * @return int 错误码
 */
int common_tabs_free(tab_handler ** handler);

/**
 * @brief 表格添加表头
 * 
 * @warning 可变参数必须为const char*类型，否则会导致严重的段错误
 * 
 * @param handler 句柄，一级指针即可
 * @param header_count 共计要传入的表头个数，最小为1
 * @param ... const char*类型，可传入多个
 * @return int 错误码
 */
int common_tabs_add_header(tab_handler *handler, int header_count, ...);

/**
 * @brief 添加表格信息
 * 
 * @warning 可变参数必须为const char*类型，否则会导致严重的段错误
 * 
 * @param handler 句柄，一级指针即可
 * @param data_count 共计要传入的数据个数，最小为1
 * @param ... const char*类型，可传入多个
 * @return int 错误码
 */
int common_tabs_add_data(tab_handler *handler, int data_count, ...);

/**
 * @brief 通过Unicode制表符打印表格信息
 * 
 * @warning Unicode有可能不通用所有平台，建议使用 \c commont_tabs_print_ascii_tabs
 * 
 * @param handler[in] 句柄，一级指针
 * @return int 
 */
int common_tabs_print_unicode_tabs(tab_handler *handler);

/**
 * @brief 通过ASCII编码打印表格信息
 * 
 * @param handler[in] 句柄，一级指针
 * @return int 
 */
int common_tabs_print_ascii_tabs(tab_handler *handler);